package vista;

import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;

import modelo.Juego;
import modelo.ladron.OrdenDeArresto;
import modelo.policia.Policia;
import controlador.ControlMenuPrincipal;
import controlador.ControlOrdenDeArresto;
import controlador.ControlVistaInicial;

import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.io.File;


public class VistaMenuPrincipal {
	
	private JPanel panelIzq;
	private VistaLugarTiempo panelSupIzq;
	private JPanel panelInfIzq;
	private JPanel panelDer;
	private JPanel panelSupDer;
	private VistaBotoneraMenuPrincipal panelInfDer;
	private static JFrame ventana;
	private static VistaMenuPrincipal instancia = null;
	private VistaLugarTiempo vistaLugarTiempo;
	
	private VistaMenuPrincipal(){
		ventana = new Ventana("Carmen Sandiego");
		Policia policia = crearPolicia(ventana);
		Juego carmenSandiego = null;
		carmenSandiego = new Juego(policia);
		carmenSandiego.comenzarJuego();
		Container content = ventana.getContentPane();
		content.setLayout(new GridLayout(1,2));
		crearPanelesIzqYDer(content);
		
        crearPanelSuperiorIzquierdo();
        crearPanelSuperiorDerecho();
        crearPanelInferiorIzquierdo();
        crearPanelInferiorDerecho(); 
        
        ventana.revalidate();
        ventana.repaint();
        new ControlMenuPrincipal((VistaBotoneraMenuPrincipal)panelInfDer,policia,carmenSandiego);
        if ((new File("InfoCiudades.xml")).exists()){
        	setearPanelInformacionPais(policia.getCiudadActual().getNombre());
        	setearPanelAMostrarInferiorIzquierdo("vistaInfoCiudad");
        }
		panelInfIzq.revalidate();
		vistaLugarTiempo.setearPolicia(policia);
		panelSupDer.add(new VistaMensajeInicial(carmenSandiego),"vistaEstadoPartida");
		panelInfIzq.add(new VistaAtaqueCasual(),"vistaAtaqueCasual");
		this.setearPanelAMostrarSuperiorDerecho("vistaEstadoPartida");
	}
	private Policia crearPolicia(JFrame ventana){
		VistaInicial vistaIngreso = new VistaInicial(ventana);
		ControlVistaInicial controlPolicia = new ControlVistaInicial(vistaIngreso);
		Policia policia = null;
		while (policia == null){
			policia = controlPolicia.getPolicia();
		}
		return policia;
	}
	private synchronized static void crearInstancia(){
		if (instancia == null ) {
			instancia = new VistaMenuPrincipal();
		}
	}
	public static VistaMenuPrincipal obtenerInstancia(){
		if (instancia == null){
			crearInstancia();
		}
		return instancia;
	}
	public static void borrarInstancia(){
		instancia = null;
		ventana.setVisible(false);
	}
	private void crearPanelesIzqYDer(Container content) {
		panelIzq = new JPanel();
		panelIzq.setBackground(Color.lightGray);
		panelIzq.setLayout(new GridBagLayout());
		content.add(panelIzq);
        
        panelDer = new JPanel();
		panelDer.setBackground(Color.lightGray);
		panelDer.setLayout(new GridBagLayout());
		content.add(panelDer);
	}
	public void setearPanelSuperiorIzquierdo (){
		GridBagConstraints cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 0;
        cns.weightx = 1;
        cns.weighty = 0.1;
        cns.fill = GridBagConstraints.BOTH;
        cns.anchor = GridBagConstraints.PAGE_START;
        
        panelSupIzq.setBorder(BorderFactory.createLineBorder(Color.white));
        panelIzq.add(panelSupIzq, cns);
	}
	public void setearPanelInferiorIzquierdo (){
		GridBagConstraints cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 1;
        cns.weightx = 1;
        cns.weighty = 0.9;
        cns.fill = GridBagConstraints.BOTH;
        cns.anchor = GridBagConstraints.PAGE_END;
        
        panelInfIzq.setBorder(BorderFactory.createLineBorder(Color.white));
        panelIzq.add(panelInfIzq, cns);
	}
	public void setearPanelSuperiorDerecho (){
		GridBagConstraints cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 0;
        cns.weightx = 1;
        cns.weighty = 0.95;
        cns.fill = GridBagConstraints.BOTH;
        cns.anchor = GridBagConstraints.PAGE_START;
        
        panelSupDer.setBorder(BorderFactory.createLineBorder(Color.white));
        panelDer.add(panelSupDer, cns);
	}
	public void setearPanelInferiorDerecho (){
		GridBagConstraints cns = new GridBagConstraints();
        cns.gridx = 0;
        cns.gridy = 1;
        cns.weightx = 1;
        cns.weighty = 0.05;
        cns.fill = GridBagConstraints.BOTH;
        cns.anchor = GridBagConstraints.PAGE_END;
        
        panelInfDer.setBorder(BorderFactory.createLineBorder(Color.white));
        panelDer.add(panelInfDer, cns);
	}
	public void crearPanelInferiorDerecho(){
		panelInfDer = new VistaBotoneraMenuPrincipal();
		setearPanelInferiorDerecho();
	}
	public void crearPanelSuperiorIzquierdo(){
		vistaLugarTiempo = new VistaLugarTiempo();
		panelSupIzq = vistaLugarTiempo;
        setearPanelSuperiorIzquierdo();
	}
	private void crearPanelSuperiorDerecho() {
		panelSupDer = new JPanel();
		panelSupDer.setLayout(new CardLayout());
		panelSupDer.setBackground(Color.black);
		panelSupDer.add(new VistaPanelSuperiorDerechoDefault(),"vistaPanelSuperiorDerechoDefault");
		setearPanelSuperiorDerecho();
	}
    public void crearPanelInferiorIzquierdo(){
    	panelInfIzq = new JPanel();
    	panelInfIzq.setLayout(new CardLayout());
    	panelInfIzq.setBackground(Color.black);
    	setearPanelInferiorIzquierdo();
    }
    public void setearPanelAMostrarInferiorIzquierdo(String nombrePanel){
    	CardLayout layout = (CardLayout) panelInfIzq.getLayout();
		layout.show(panelInfIzq, nombrePanel);
    }
    public void setearPanelAMostrarSuperiorDerecho(String nombrePanel){
    	CardLayout layout = (CardLayout) panelSupDer.getLayout();
		layout.show(panelSupDer, nombrePanel);
    }
    public void setearPanelInformacionPais(String nuevaCiudad){
    	panelInfIzq.add(new VistaInfoCiudad(nuevaCiudad), "vistaInfoCiudad");
    }
	public void bloquearBotones() {
		panelInfDer.bloquearBotones();
	}
	public void desbloquearBotones() {
		panelInfDer.desbloquearBotones();
	}
	public void resetearVistas(Juego juego){
		if ((new File("InfoCiudades.xml")).exists()){
	    	setearPanelInformacionPais(juego.getPolicia().getCiudadActual().getNombre());
	    	setearPanelAMostrarInferiorIzquierdo("vistaInfoCiudad");
	    }
		panelInfIzq.revalidate();
		panelSupDer.add(new VistaMensajeInicial(juego),"vistaEstadoPartida");
		setearPanelAMostrarSuperiorDerecho("vistaEstadoPartida");
		desbloquearBotones();	
		panelSupIzq.setVisible(false);
		panelSupIzq.resetearVista();
		panelSupIzq.setVisible(true);
		OrdenDeArresto.borrarInstancia();		
		VistaOrdenDeArresto.borrarInstancia();			
		panelInfIzq.add(VistaOrdenDeArresto.obtenerInstancia(),"vistaOrdenDeArresto");
		ControlOrdenDeArresto.borrarInstancia();
		ControlOrdenDeArresto.obtenerInstancia().setearJuego(juego);
	}
	public JPanel getPanelInfIzq(){
		return panelInfIzq;
	}
	public JPanel getPanelSupDer(){
		return panelSupDer;
	}
	public VistaLugarTiempo getPanelLugarTiempo(){
		return panelSupIzq;
	}
	public void setearEtiquetaLugarTiempoVacia(){
		panelSupIzq.setearEtiquetaVacia();
	}
}

